//
//  NSMutableArray+Extension.m
//  runtime
//
//  Created by eport on 2020/12/13.
// https://www.jianshu.com/p/e0d46032b27f

#import "NSMutableArray+Extension.h"
#import <objc/runtime.h>

//方法交换
@implementation NSMutableArray (Extension)


//类方法，只在runtime调用一次,在APP运行时调用.+ (void)load. 方法只要加入了工程种，进行了编译，且.m中实现了这个方法，都会调用一次，值得注意的时没实现的子类是不会调用的，就算父类实现了也不行
+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 类簇：NSString、NSArray、NSDictionary，真实类型是其他类型
        Class cls = NSClassFromString(@"__NSArrayM");
        Method method1 = class_getInstanceMethod(cls, @selector(insertObject:atIndex:));
        Method method2 = class_getInstanceMethod(cls, @selector(jf_insertObject:atIndex:));
        method_exchangeImplementations(method1, method2);
    });
}

- (void)jf_insertObject:(id)anObject atIndex:(NSUInteger)index{

    if (anObject == nil) return;//如果是空对象，就不添加，防止奔溃

    //拦截之后，再调用系统的实现，由于不知道底层实现逻辑，自己实现系统方法可能会出各种意想不到的错
    [self jf_insertObject:anObject atIndex:index];//这儿看似死循环，细理逻辑，方法实现已经交换过了的
}

@end
